package com.alvis.media;

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Heart extends JPanel {
    // 新增：透明度控制变量
    private float alpha = 1.0f;
    private int direction = -1; // 透明度变化方向：-1表示降低，1表示增加

    // 重写绘制方法
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        // 修改：使用带透明度的颜色
        g.setColor(new Color(1.0f, 0.0f, 0.0f, alpha));

        // 爱心的中心点坐标
        int centerX = getWidth() / 2;
        int centerY = getHeight() / 2;
        // 爱心大小
        int size = 100;

        // 绘制爱心
        drawHeart(g, centerX, centerY, size);

        // 新增：控制透明度变化
        alpha += direction * 0.01f;
        if (alpha <= 0.3f || alpha >= 1.0f) {
            direction *= -1; // 反转方向
        }
    }

    // 绘制爱心的方法
    private void drawHeart(Graphics g, int x, int y, int size) {
        // 爱心的数学公式实现
        int[] xPoints = new int[100];
        int[] yPoints = new int[100];

        for (int i = 0; i < 100; i++) {
            double t = i * 0.01 * Math.PI * 2;
            // 参数方程计算爱心的坐标
            double xVal = 16 * Math.pow(Math.sin(t), 3);
            double yVal = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t);

            // 缩放并移动到中心位置
            xPoints[i] = x + (int)(xVal * size / 16);
            yPoints[i] = y - (int)(yVal * size / 16); // 减号是因为屏幕Y轴向下为正
        }

        // 填充爱心
        g.fillPolygon(xPoints, yPoints, 100);
    }

    public static void main(String[] args) {
        // 创建窗口
        JFrame frame = new JFrame("爱心图案");
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null); // 窗口居中

        // 添加自定义面板
        Heart heartPanel = new Heart();
        frame.add(heartPanel);

        // 显示窗口
        frame.setVisible(true);

        // 新增：定时重绘实现动画效果
        new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(50); // 每50毫秒刷新一次
                    heartPanel.repaint();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
